package com.solution.admin.auth.dao.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.solution.admin.auth.dao.RoleDao;
import com.solution.admin.auth.entity.RoleEntity;
import com.solution.common.dao.impl.BaseDaoImpl;
import com.solution.common.page.PageBean;
import com.solution.common.page.PageParam;

/**
 * 角色管理Dao实现
 * @author yaoyu
 * @date 2017年3月28日 下午7:18:47
 */
@Repository
public class RoleDaoImpl extends BaseDaoImpl<RoleEntity> implements RoleDao {
	public static final String SQL_INSERT_ROLE_RESOURCE = "insertRoleResource";
	public static final String SQL_DELETE_ROLE_RESOURCE_BY_ID = "deleteRoleResourceById";
	public static final String SQL_GET_ROLE_RESOURCE_BY_ID = "getRoleResourceById";
	public static final String SQL_GET_ROLE_BY_CODE = "getRoleByCode";
	public static final String SQL_GET_ROLE_BY_NAME = "getRoleByName";

	@Autowired
	private SqlSessionTemplate sessionTemplate;

	/**
	 * 获取单个角色
	 * 
	 * @author yaoyu
	 * @date 2017年3月28日 上午11:31:50
	 * @param roleCode
	 * @return
	 */
	@Override
	public RoleEntity getRole(long roleCode) {
		return super.getById(roleCode);
	}

	/**
	 * 新增角色
	 * 
	 * @author yaoyu
	 * @date 2017年3月28日 上午11:32:12
	 * @param role
	 * @return
	 */
	@Override
	public long saveRole(RoleEntity role) {
		return super.insert(role);
	}

	/**
	 * 更新角色
	 * 
	 * @author yaoyu
	 * @date 2017年3月28日 上午11:32:25
	 * @param role
	 * @return
	 */
	@Override
	public int updateRole(RoleEntity role) {
		return super.update(role);
	}

	/**
	 * 更新角色状态
	 * 
	 * @author llp
	 * @date 2017年3月28日 上午11:32:25
	 * @param role
	 *            角色
	 * @return
	 */
	@Override
	public int updateRoleStatus(RoleEntity role) {
		return getSessionTemplate().update(getStatement("updateRoleStatus"), role);
	}

	/**
	 * 删除角色
	 * 
	 * @author yaoyu
	 * @date 2017年3月28日 上午11:32:38
	 * @param roleCode
	 * @return
	 */
	@Override
	public int removeRole(long roleCode) {
		return super.deleteById(roleCode);
	}

	/**
	 * 查询用户登录某系统的角色列表
	 * 
	 * @param param
	 * @return
	 * @author llp
	 * @date 2017年4月18日 上午11:54:38
	 */
	@Override
	public List<RoleEntity> listRole(Map<String, Object> param) {
		return getSessionTemplate().selectList(getStatement("listRole"), param);
	}

	/**
	 * 根据经销商编号查询角色列表
	 * 
	 * @param param
	 * @return
	 * @author chenl
	 * @date 2017年5月22日 下午2:25:21
	 */
	@Override
	public List<RoleEntity> listRoleByDealerId(Map<String, Object> param) {
		return getSessionTemplate().selectList(getStatement("listRoleByDealerId"), param);
	}

	/**
	 * 插入角色资源
	 * @param map
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月10日 上午8:53:50
	 */
	@Override
	public int insertRoleResource(Map<String, Object> map) {
		int result = sessionTemplate.insert(getStatement(SQL_INSERT_ROLE_RESOURCE), map);
		return result;
	}

	/**
	 * 删除角色资源
	 * 
	 * @param id
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月10日 上午9:10:31
	 */
	@Override
	public int deleteRoleResourceById(long id) {
		int result = sessionTemplate.delete(getStatement(SQL_DELETE_ROLE_RESOURCE_BY_ID), id);
		return result;
	}

	/**
	 * 通过ID取得角色资源
	 * 
	 * @param id
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月10日 上午9:24:15
	 */
	@Override
	public List<Long> getRoleResourceById(Map<String, Object> map) {
		return sessionTemplate.selectList(getStatement(SQL_GET_ROLE_RESOURCE_BY_ID), map);
	}

	/**
	 * 分页取得角色列表
	 * 
	 * @param pageParam
	 * @param paramMap
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月11日 上午11:34:11
	 */
	@Override
	public PageBean getRolePage(PageParam pageParam, Map<String, Object> paramMap) {
		return super.listPage(pageParam, paramMap);
	}

	/**
	 * 通过名称取得角色
	 * 
	 * @param roleName
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月13日 上午11:20:34
	 */
	@Override
	public long getRoleByName(String roleName) {
		return sessionTemplate.selectOne(getStatement(SQL_GET_ROLE_BY_NAME), roleName);
	}

	/**
	 * 通过编码取得角色
	 * 
	 * @param roleCode
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月13日 上午11:20:34
	 */
	@Override
	public long getRoleByCode(String roleCode) {
		return sessionTemplate.selectOne(getStatement(SQL_GET_ROLE_BY_CODE), roleCode);
	}

	/**
	 * 查询用户是否是某角色
	 * 
	 * @param userId
	 *            用户ID
	 * @param roleId
	 *            角色ID
	 * @return true 有 false 无
	 */
	@Override
	public boolean checkUserRoleChkFlg(Long userId, Long roleId) {
		Map<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put("userId", userId);
		paramMap.put("roleId", roleId);
		Long result = sessionTemplate.selectOne(getStatement("checkUserRoleChkFlg"), paramMap);
		if(null != result && result > 0) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 查询所有角色
	 * 
	 * @return
	 * @author diwankang
	 * @date 2017年4月13日 下午5:28:53
	 */
	@Override
	public List<RoleEntity> listAllRoleList() {
		return getSessionTemplate().selectList(getStatement("listAllRole"));
	}

	/**
	 * 查询用户的角色信息
	 * 
	 * @param userId
	 *            用户ID
	 * @return
	 * @author llp
	 * @date 2017年4月14日 上午8:55:29
	 */
	public List<RoleEntity> listRoleListByUserId(Long userId) {
		return getSessionTemplate().selectList(getStatement("listRoleListByUserId"), userId);
	}

	/**
	 * 查询用户可分配及已分配的角色列表
	 * 
	 * @param dealerId
	 *            经销商ID
	 * @param userId
	 *            用户ID
	 * @return 角色列表
	 */
	@Override
	public List<RoleEntity> listRoleWithChkflagForUser( Long userId) {
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put("userId", userId);
		String statementSQL = getStatement("listRoleWithChkflagForUser");
		return getSessionTemplate().selectList(statementSQL, paramMap);
	}

	/**
	 * 更新角色名称
	 * 
	 * @param roleId
	 *            角色编号
	 * @param roleName
	 *            角色名称
	 * @return 更数的行数
	 */
	@Override
	public int updateRoleName(Long roleId, String roleName,String roleIntro) {
		int result = 0;
		if (roleId != null && roleName != null) {
			HashMap<String, Object> paramMap = new HashMap<String, Object>();
			if (roleId.longValue() > 0 && !roleName.equals("")) {
				paramMap.put("id", roleId);
				paramMap.put("roleName", roleName);
				paramMap.put("roleIntro", roleIntro);
				result = this.getSessionTemplate().update(this.getStatement("updateRoleName"), paramMap);
			}
			paramMap = null;
		}
		return result;

	}
	
	/**
	 * 删除角色授权
	 * @param id
	 */
	public void deleteRoleResourceByRoleId(Long roleId){
		getSessionTemplate().delete(getStatement("deleteRoleResourceByRoleId"), roleId);
	}
	
	
	/**
	 * 逻辑删除角色
	 * @param roleId
	 * @return
	 */
	public int logicDeleteRole(long roleId){
		return getSessionTemplate().delete(getStatement("logicDeleteRole"), roleId);
	}
}
